//#include "ECDSA.h"
//extern "C"
//{
//#include <ctype.h> // for isxdigit
//}

//bool ECDSA::GENERATE_ECC_KEY(int nid, ECC_KEY_STRING& key)
//{
//    unsigned char* keybuf = NULL;
//    EC_KEY* ec_key = EC_KEY_new_by_curve_name(nid);
//    if (!ec_key) {
//        return false;
//    }

//    //生成密钥对
//    if (!EC_KEY_generate_key(ec_key)) {
//        EC_KEY_free(ec_key);
//        return false;
//    }

//    size_t len = EC_KEY_priv2buf(ec_key, &keybuf);
//    if (len == 0){
//        EC_KEY_free(ec_key);
//        return false;
//    }
//    MString::uchar_QString(keybuf, len, key.prikey);

//    len = EC_KEY_key2buf(ec_key, POINT_CONVERSION_UNCOMPRESSED ,&keybuf, NULL);
//    if (len == 0) {
//        EC_KEY_free(ec_key);
//        return false;
//    }

//    MString::uchar_QString(&keybuf[1], len - 1, key.pubkey);

//    key.prikey = key.prikey.toUpper();
//    key.pubkey = key.pubkey.toUpper();
//    // 释放资源
//    EC_KEY_free(ec_key);
//    return true;
//}

//bool ECDSA::GENERATE_ECC_KEY_B(int nid, ECC_KEY_STRING& key)
//{
//    BIGNUM* x = BN_new();
//    BIGNUM* y = BN_new();
//    EC_KEY* ec_key = EC_KEY_new_by_curve_name(nid);
//    if (!ec_key) {
//        return false;
//    }

//    // 生产密钥对
//    if (!EC_KEY_generate_key(ec_key)) {
//        EC_KEY_free(ec_key);
//        return false;
//    }

//    key.prikey.clear();
//    key.prikey.append(QString(BN_bn2hex(EC_KEY_get0_private_key(ec_key))));

//    if (EC_POINT_get_affine_coordinates_GFp(EC_GROUP_new_by_curve_name(nid), EC_KEY_get0_public_key(ec_key),
//        x, y, NULL) != 1) {
//        return false;
//    }

//    key.pubkey.clear();
//    key.pubkey.append(QString(BN_bn2hex(x)));
//    key.pubkey.append(QString(BN_bn2hex(y)));

//    // 释放资源
//    EC_KEY_free(ec_key);
//    BN_free(x);
//    BN_free(y);
//    return true;
//}

//bool ECDSA::GENERATE_ECC_KEY_EVP(int nid, ECC_KEY_STRING& key)
//{
//    EVP_PKEY_CTX* pctx = NULL, * kctx = NULL;
//    EVP_PKEY* params = NULL, * pkey = NULL;
//    int ret = 0;

//    // 创建参数生成上下文
//    pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_EC, NULL);
//    if (!pctx) {
//        fprintf(stderr, "EVP_PKEY_CTX_new_id failed\n");
//        ERR_print_errors_fp(stderr);
//        return false;
//    }

//    // 初始化参数生成上下文，指定曲线
//    if (EVP_PKEY_paramgen_init(pctx) <= 0 || EVP_PKEY_CTX_set_ec_paramgen_curve_nid(pctx, nid) <= 0) {
//        fprintf(stderr, "EVP_PKEY_paramgen_init or EVP_PKEY_CTX_set_ec_paramgen_curve_nid failed\n");
//        ERR_print_errors_fp(stderr);
//        return false;
//    }

//    //生成参数
//    if (EVP_PKEY_paramgen(pctx, &params) <= 0) {
//        fprintf(stderr, "EVP_PKEY_paramgen failed\n");
//        ERR_print_errors_fp(stderr);
//        return false;
//    }

//    // 创建密钥生成上下文
//    kctx = EVP_PKEY_CTX_new(params, NULL);
//    if (!kctx) {
//        fprintf(stderr, "EVP_PKEY_CTX_new failed\n");
//        ERR_print_errors_fp(stderr);
//        return false;
//    }

//    // 初始化密钥生成上下文
//    if (EVP_PKEY_keygen_init(kctx) <= 0) {
//        fprintf(stderr, "EVP_PKEY_keygen_init failed\n");
//        ERR_print_errors_fp(stderr);
//        return false;
//    }

//    // 生成密钥对
//    if (EVP_PKEY_keygen(kctx, &pkey) <= 0) {
//        fprintf(stderr, "EVP_PKEY_keygen failed\n");
//        ERR_print_errors_fp(stderr);
//        return false;
//    }

//    unsigned char* p = NULL;

//    int len = i2d_PrivateKey(pkey, &p);

//    MString::uchar_QString(p, len, key.prikey);

//    qDebug() << len << " " << key.prikey;

//    OPENSSL_free(p);
//    p = NULL;
//    len = 0;

//    len = i2d_PublicKey(pkey, &p);

//    MString::uchar_QString(p, len, key.pubkey);

//    qDebug() << len << " " << key.pubkey;

//    OPENSSL_free(p);
//    p = NULL;

//    return true;
//}

//QString ECDSA::ECC_SIGN(int nid, const ECC_KEY_STRING key, const QString E, uint8_t* err_log)
//{
//    unsigned char dgst[2048] = { 0 }, key_pri[512] = { 0 }, sign[512] = {0};
//    unsigned int siglen = 0;
//    const char* p = (char*)key_pri;
//    QString E_DATA = E,sign_str = "";
//    EC_KEY* ec_key = EC_KEY_new_by_curve_name(nid);
//    if (!ec_key) {
//        return false;
//    }

//    MString::addspace(E_DATA);
//    MString::QString_uchar(E_DATA, dgst);
//    MString::QString_uchar(key.prikey, (uint8_t *)key_pri);


//    QByteArray pemData = key.prikey.toUtf8();

//    BIGNUM* pri_bn;

//    BN_hex2bn(&pri_bn, pemData);


//    QByteArray byteArray = key.prikey.toUtf8();
//    std::string pemStr = byteArray.toStdString();

//    // 创建BIO对象来读取PEM字符串
//    BIO* bio = BIO_new_mem_buf(pemStr.c_str(), -1);
//    if (bio == nullptr) {
//        if (err_log != NULL) {
//            *err_log = 5;
//        }
//        return "";
//    }

//    // 创建EC_KEY对象
//    EC_KEY* ecKey = PEM_read_bio_ECPrivateKey(bio, &ec_key, nullptr, nullptr);
//    BIO_free(bio);

//    //if (EC_KEY_set_private_key(ecKey, pri_bn) != 1)
//    //{
//    //    if (err_log != NULL) {
//    //        *err_log = 4;
//    //    }
//    //    return "";
//    //}

//    if (EC_KEY_check_key(ecKey) != 1){
//        if (err_log != NULL){
//            *err_log = ECC_KEY_ERR;
//        }
//        return "";
//    }

//    //生成签名值
//    if (ECDSA_sign(0, dgst, E_DATA.size() / 2, sign, &siglen, ec_key) != 1){
//        if (err_log != NULL){
//            *err_log = ECC_SIGN_ERR;
//        }
//        return "";
//    }

//    MString::uchar_QString(sign, siglen, sign_str);

//    return sign_str;
//}

//bool ECDSA::ECC_VERIFY(int nid, const ECC_KEY_STRING key, const QString E, const QString Sign)
//{
//    return false;
//}
